package com.cw.myhashmap;

import java.util.*;

public class HashMapDemo2 {
    public static void main(String[] args) {
        /*
            某个班级80名学生，现在需要组成秋游活动，
            班长提供了四个景点依次是（A、B、C、D）,
            每个学生只能选择一个景点，请统计出最终哪个景点想去的人数最多。
        */
        //1.需要先让同学们投票
        //定义一个数组，存储4个景点
//        String[] arr = {"A","B","C","D"};
        List<String> arr = new LinkedList<>();
        // 尾插
        arr.add("A");
        arr.add("B");
        arr.add("C");
        arr.add("D");
        //利用随机数模拟80个同学的投票，并把投票的结果存储起来
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        // 80.fori(快捷键)
        for (int i = 0; i < 80; i++) {
            // 生成一个随机数作为投票选项的索引，范围是[0,arr.size())
            int index = r.nextInt(arr.size());
            // 根据随机索引从arr中获取投票选项，并添加到list中
            list.add(arr.get(index));
        }
        //2.如果要统计的东西比较多，不方便使用计数器思想
        //我们可以定义map集合，利用集合进行统计。
        HashMap<String,Integer> hm = new HashMap<>();
        for (String name : list) {
            //判断当前的景点在map集合当中是否存在
            if(hm.containsKey(name)){
                //存在
                //先获取当前景点已经被投票的次数
                // 注：Entry对象才有getKey()与getValue()方法
                int count = hm.get(name);// 通过key获取value
                //表示当前景点又被投了一次
                count++;
                //把新的次数再次添加到集合当中
                hm.put(name,count);
            }else{
                //不存在
                hm.put(name,1);
            }
        }

        System.out.println(hm);

/*        // 测试存在票数相同的情况下是否能够正确输出最大值及景点名
        HashMap<String,Integer> hm = new HashMap<>();
        hm.put("A",20);
        hm.put("B",20);
        hm.put("C",20);
        hm.put("D",20);
        System.out.println(hm);*/

        //3.求最大值
        int max = 0;
        for (Map.Entry<String, Integer> stringIntegerEntry : hm.entrySet()) {
            Integer value = stringIntegerEntry.getValue();
            if (value > max){
                max = value;
            }
        }
        System.out.println(max);
        //4.判断哪个景点的次数跟最大值一样，如果一样，打印出来
        for (Map.Entry<String, Integer> stringIntegerEntry : hm.entrySet()) {
            Integer value = stringIntegerEntry.getValue();
            if (value == max){
                String key = stringIntegerEntry.getKey();
                System.out.println(key);
            }
        }


    }
}
